/**
 * 云函数入口文件
 * 增强版 - 处理初始化和返回值序列化问题
 */

// 首先设置默认环境变量，避免未定义问题
process.env.NODE_ENV = 'production'; // 默认生产环境

// 延迟加载依赖，以避免初始化阶段错误
let cloud = null;
let db = null;
let _ = null;
let application = null;
let config = null;

// 设置常量
const COLLECTION = 'sample';

// 引入PLM研发项目数据库初始化模块
const plmInitCollections = require('./project/plm/init/init_cloud_collections.js');

/**
 * 确保返回安全的结果对象
 * @param {*} result 原始结果
 * @returns {Object} 安全的结果对象
 */
function ensureSafeResult(result) {
	// 如果结果不存在或不是对象，返回空对象
	if (!result || typeof result !== 'object') {
		return { code: 0, data: {} };
	}
	
	// 安全复制属性
	const safeResult = { ...result };
	
	// 确保code存在
	if (typeof safeResult.code !== 'number') {
		safeResult.code = 0;
	}
	
	// 确保data是对象
	if (!safeResult.data || typeof safeResult.data !== 'object') {
		safeResult.data = {};
	}
	
	return safeResult;
}

/**
 * 云函数入口函数
 */
exports.main = async (event, context) => {
	try {
		// 加载依赖，放在try中以便捕获加载错误
		cloud = require('wx-server-sdk');
		application = require('./framework/core/application.js');
		config = require('./config/config.js');
		
		// 初始化环境变量
		process.env.DEBUG_MODE = config.DEBUG_MODE ? 'true' : 'false';
		process.env.NODE_ENV = config.NODE_ENV || 'production';
		
		// 安全初始化云函数环境 - 兼容企业微信
		try {
			// 使用更安全的初始化方式，处理企业微信环境
			cloud.init({
				env: cloud.DYNAMIC_CURRENT_ENV,
				throwOnError: false, // 不抛出错误
				traceUser: true // 跟踪用户以便于调试
			});
			console.log('[Cloud Function] 云环境初始化成功');
		} catch (initErr) {
			console.error('[Cloud Function] 云函数环境初始化失败:', initErr);
		}
		
		db = cloud.database();
		_ = db.command;

		// 尝试初始化PLM研发项目数据库
		try {
			const initResult = await plmInitCollections.initCollections();
			console.log('[Cloud Function] PLM研发项目数据库初始化结果:', initResult);
		} catch (initError) {
			console.error('[Cloud Function] PLM研发项目数据库初始化失败:', initError);
			// 继续执行，不阻断主流程
		}
		
		// 记录请求信息
		console.log('[EVENT] 事件对象:', JSON.stringify(event));
		
		// 安全获取微信上下文 - 兼容企业微信
		let wxContext = {};
		try {
			// 通用上下文获取，适用于普通微信和企业微信
			wxContext = cloud.getWXContext();
			
			// 企业微信特定字段
			if (wxContext.FROM_WXWORK) {
				console.log('[企业微信环境] 检测到企业微信环境');
			}
			
			console.log('[WXContext] 获取上下文成功:', JSON.stringify({
				OPENID: wxContext.OPENID,
				APPID: wxContext.APPID,
				UNIONID: wxContext.UNIONID,
				FROM_WXWORK: wxContext.FROM_WXWORK || false,
				// 企业微信特有字段
				CORPID: wxContext.CORPID,
				QY_USER_INFO: wxContext.QY_USER_INFO
			}));
		} catch (ctxErr) {
			console.error('[WXContext] 获取微信上下文失败:', ctxErr);
		}
		
		// 调用应用处理请求，传入微信上下文
		const result = await application(event, context, wxContext);
		
		// 确保返回值安全
		const safeResult = ensureSafeResult(result);
		return safeResult;
	} catch (error) {
		console.error('[FATAL ERROR] 云函数执行错误:', error);
		
		// 返回安全的错误对象
		return {
			code: 500,
			msg: '服务器繁忙，请稍后再试',
			data: {}
		};
	}
};

/**
 * 获取样品列表
 */
async function getSampleList(params) {
	try {
		console.log('[SAMPLE_LIST] 开始获取样品列表, 参数:', params);
		let { search = '' } = params;
		let where = {};

		if (search) {
			where = _.or([
				{ sampleNo: db.RegExp({ regexp: search, options: 'i' }) },
				{ name: db.RegExp({ regexp: search, options: 'i' }) }
			]);
		}

		console.log('[SAMPLE_LIST] 查询条件:', where);

		const query = db.collection(COLLECTION)
			.where(where)
			.orderBy('createTime', 'desc');

		const list = await query.get();
		console.log('[SAMPLE_LIST] 查询结果数量:', list.data.length);

		for (let k in list.data) {
			list.data[k].statusDesc = getStatusDesc(list.data[k].status);
		}

		// 确保结果可序列化
		const safeData = JSON.parse(JSON.stringify(list.data));
		return { code: 0, data: { list: safeData } };
	} catch (err) {
		console.error('[SAMPLE_LIST] 获取样品列表失败:', err);
		return { code: -1, msg: '获取样品列表失败' };
	}
}

/**
 * 获取样品详情
 */
async function getSampleDetail(params) {
	try {
		console.log('[SAMPLE_DETAIL] 开始获取样品详情, 参数:', params);
		let { id } = params;
		const detail = await db.collection(COLLECTION).doc(id).get();
		if (!detail.data) {
			console.error('[SAMPLE_DETAIL] 样品不存在:', id);
			return { code: -1, msg: '样品不存在或已删除' };
		}

		detail.data.statusDesc = getStatusDesc(detail.data.status);
		console.log('[SAMPLE_DETAIL] 获取样品详情成功');
		
		// 确保结果可序列化
		const safeData = JSON.parse(JSON.stringify(detail.data));
		return { code: 0, data: safeData };
	} catch (err) {
		console.error('[SAMPLE_DETAIL] 获取样品详情失败:', err);
		return { code: -1, msg: '获取样品详情失败' };
	}
}

/**
 * 添加样品
 */
async function insertSample(params, openId) {
	try {
		console.log('[SAMPLE_INSERT] 开始添加样品, 参数:', params);
		const { sampleNo, name, spec, location, status, desc } = params;

		// 检查样品编号是否已存在
		const check = await db.collection(COLLECTION)
			.where({ sampleNo })
			.get();
		if (check.data.length > 0) {
			console.error('[SAMPLE_INSERT] 样品编号已存在:', sampleNo);
			return { code: -1, msg: '样品编号已存在' };
		}

		const data = {
			sampleNo,
			name,
			spec,
			location,
			status: Number(status),
			desc,
			createTime: db.serverDate(),
			createBy: openId
		};

		// 确保数据可序列化
		const safeData = JSON.parse(JSON.stringify(data));
		await db.collection(COLLECTION).add({ data: safeData });
		console.log('[SAMPLE_INSERT] 添加样品成功');
		return { code: 0, msg: '添加成功' };
	} catch (err) {
		console.error('[SAMPLE_INSERT] 添加样品失败:', err);
		return { code: -1, msg: '添加失败' };
	}
}

/**
 * 编辑样品
 */
async function editSample(params) {
	try {
		console.log('[SAMPLE_EDIT] 开始编辑样品, 参数:', params);
		const { id, sampleNo, name, spec, location, status, desc } = params;

		// 检查样品编号是否已存在（排除自己）
		const check = await db.collection(COLLECTION)
			.where({
				_id: _.neq(id),
				sampleNo
			})
			.get();
		if (check.data.length > 0) {
			console.error('[SAMPLE_EDIT] 样品编号已存在:', sampleNo);
			return { code: -1, msg: '样品编号已存在' };
		}

		const data = {
			sampleNo,
			name,
			spec,
			location,
			status: Number(status),
			desc,
			updateTime: db.serverDate()
		};

		// 确保数据可序列化
		const safeData = JSON.parse(JSON.stringify(data));
		await db.collection(COLLECTION).doc(id).update({ data: safeData });
		console.log('[SAMPLE_EDIT] 编辑样品成功');
		return { code: 0, msg: '编辑成功' };
	} catch (err) {
		console.error('[SAMPLE_EDIT] 编辑样品失败:', err);
		return { code: -1, msg: '编辑失败' };
	}
}

/**
 * 删除样品
 */
async function deleteSample(params) {
	try {
		console.log('[SAMPLE_DELETE] 开始删除样品, 参数:', params);
		const { id } = params;
		await db.collection(COLLECTION).doc(id).remove();
		console.log('[SAMPLE_DELETE] 删除样品成功');
		return { code: 0, msg: '删除成功' };
	} catch (err) {
		console.error('[SAMPLE_DELETE] 删除样品失败:', err);
		return { code: -1, msg: '删除失败' };
	}
}

/**
 * 获取状态描述
 */
function getStatusDesc(status) {
	const statusMap = {
		0: '未知',
		1: '待审核',
		2: '在库',
		3: '已出库',
		4: '已报废'
	};
	return statusMap[status] || '未知';
}